#include "RpcConfig.h"
#include "../user.pb.h"  // 假设这里的路径是正确的，且文件名已更改
#include "RpcController.h"
#include <iostream>
#include <atomic>
#include <thread>
#include <chrono>
#include "RpcLogger.h"

// 发送 RPC 请求的函数，模拟客户端调用远程服务
void send_login_request(const std::string& name,const std::string& pwd) {
    // 创建一个 UserServiceRpc_Stub 对象，用于调用远程的 RPC 方法
    User::UserServiceRpc_Stub stub(new EasyRpc::RpcChannel(false));

    // 设置 RPC 方法的请求参数
    User::LoginRequest request;
    request.set_name(name);  // 设置用户名
    request.set_pwd(pwd);    // 设置密码

    // 定义 RPC 方法的响应参数
    User::LoginResponse response;
    RpcController controller;  // 创建控制器对象，用于处理 RPC 调用过程中的错误

    // 调用远程的 Login 方法
    stub.Login(&controller, &request, &response, nullptr);

    // 检查 RPC 调用是否成功
    if (controller.Failed()) {  // 如果调用失败
        std::cout << controller.ErrorText() << std::endl;  // 打印错误信息
    } else {  // 如果调用成功
        if (0 == response.result().errcode()) {  // 检查响应中的错误码
            std::cout << "rpc login response success:" << response.success() << std::endl;  // 打印成功信息
        } else {  // 如果响应中有错误
            std::cout << "rpc login response error : " << response.result().errmsg() << std::endl;  // 打印错误信息
        }
    }
}

// 发送注册请求的函数，模拟客户端调用远程服务
void send_register_request(const std::string& name,const std::string& pwd) {
    // 创建一个 UserServiceRpc_Stub 对象，用于调用远程的 RPC 方法
    User::UserServiceRpc_Stub stub(new EasyRpc::RpcChannel(false));

    // 设置 RPC 方法的请求参数
    User::RegisterRequest request;
    request.set_name(name);  // 使用线程ID生成用户名以确保唯一性
    request.set_pwd(pwd);   // 使用线程ID生成密码

    // 定义 RPC 方法的响应参数
    User::RegisterResponse response;
    RpcController controller;  // 创建控制器对象，用于处理 RPC 调用过程中的错误

    // 调用远程的 Register 方法
    stub.Register(&controller, &request, &response, nullptr);

    // 检查 RPC 调用是否成功
    if (controller.Failed()) {  // 如果调用失败
        std::cout << controller.ErrorText() << std::endl;  // 打印错误信息
    } else {  // 如果调用成功
        if (0 == response.result().errcode()) {  // 检查响应中的错误码
            std::cout << "rpc register response success:" << response.success() << std::endl;  // 打印成功信息
        } else {  // 如果响应中有错误
            std::cout << "rpc register response error : " << response.result().errmsg() << std::endl;  // 打印错误信息
        }
    }
}

std::string getUserInput(const std::string &prompt) {
    std::string input;
    do {
        std::cout << prompt;
        std::getline(std::cin, input);
        if (input.empty()) {
            std::cout << "输入不能为空，请重新输入。\n";
        }
    } while (input.empty());
    return input;
}

int main(int argc, char **argv) {
    // 初始化 RPC 框架，解析命令行参数并加载配置文件
    RpcApplication::Init(argc, argv);
    // 创建日志对象
    RpcLogger logger("EasyRpc");

    std::string action;
    while (true){
        action = getUserInput("请输入 'login', 'register' 或 'exit': ");
        if (action == "register") {
            std::string name = getUserInput("请输入用户名: ");
            std::string pwd = getUserInput("请输入密码: ");
            send_register_request(name, pwd);
        } else if (action == "login") {
            std::string name = getUserInput("请输入用户名: ");
            std::string pwd = getUserInput("请输入密码: ");
            send_login_request(name, pwd);
        } else if (action == "exit") {
            std::cout << "退出程序\n";
            exit(0);
        } else {
            std::cout << "无效的命令，请输入 'login', 'register' 或 'exit'.\n";
        }
    }
    return 0;
}